package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.ConceptoMovimiento;
import com.ingenio.business.TipoMovimiento;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class ConceptoMovimientoAdapter extends Adapter{
	
	public void agregarMovimiento(ConceptoMovimiento concepto) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add ="INSERT into conceptomovimiento (descConcepto, IdtipoMovimiento, cmHabilitado) " +
					"VALUES (? , ?, 1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, concepto.getDescConcepto());
			stmt.setInt(2, concepto.getTipoMovimiento().getIdTipoMovimiento());
	    	stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarConcepto(ConceptoMovimiento concepto) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	
    	try {
	    	conn = (Connection) abrirConexion();
	    	String del ="UPDATE conceptomovimiento SET cmHabilitado = 0 WHERE IdConceptoMovimiento = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(del);
	    	stmt.setInt(1, concepto.getIdConcepto());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    }
	
	public void modificarConcepto(ConceptoMovimiento concepto) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String upd ="UPDATE conceptomovimiento SET descConcepto = ?,IdTipoMovimiento = ? WHERE IdConceptoMovimiento = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(upd);
	    	stmt.setString(1, concepto.getDescConcepto());
	    	stmt.setInt(2, concepto.getTipoMovimiento().getIdTipoMovimiento());
	    	stmt.setInt(3, concepto.getIdConcepto());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    }
	
	public ConceptoMovimiento devolverConcepto(Integer id) throws Exception{
    	Connection conn = null;
    	ConceptoMovimiento c = null;
    	TipoMovimientoAdapter tma = new TipoMovimientoAdapter();
    	TipoMovimiento tm = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel = "SELECT * FROM conceptomovimiento WHERE IdConceptoMovimiento = ? and cmHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, id);
    		ResultSet result = stmt.executeQuery();
    		
    		if(result.next()){
    			String descripcion = result.getString("descConcepto");
    			Integer idTipoMovimiento = result.getInt("IdTipoMovimiento");
    			tm = tma.devolverTipoMovimiento(idTipoMovimiento);
    			c = new ConceptoMovimiento(id, descripcion, tm, true);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return c;
    }
	
	public List<ConceptoMovimiento> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<ConceptoMovimiento> conceptos = new ArrayList<ConceptoMovimiento>();
    	PreparedStatement stmt = null;
		TipoMovimientoAdapter tma = new TipoMovimientoAdapter();
    	try {
			conn = (Connection) abrirConexion();
    		ConceptoMovimiento c = null;
    		TipoMovimiento tm = null;
    		String sel ="SELECT * from conceptomovimiento WHERE cmHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery(sel);
    		while(result.next()){
    			Integer id = result.getInt("IdConceptoMovimiento");
    			String descripcion = result.getString("descConcepto");
    			Integer idTipo = result.getInt("IdTipoMovimiento");
    			tm = tma.devolverTipoMovimiento(idTipo);
    			c = new ConceptoMovimiento(id, descripcion, tm, true);
    			conceptos.add(c);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return conceptos;
    }
	
	public List<ConceptoMovimiento> devolverConceptosTipoMov(TipoMovimiento tipoMov) throws Exception{
    	Connection conn = null;
    	List<ConceptoMovimiento> conceptos = new ArrayList<ConceptoMovimiento>();
    	PreparedStatement stmt = null;
    	try {
			conn = (Connection) abrirConexion();
    		ConceptoMovimiento cm = null;
    		String sel ="SELECT * from conceptomovimiento WHERE IdTipoMovimiento = ? AND  cmHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, tipoMov.getIdTipoMovimiento());
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			Integer id = result.getInt("IdConceptoMovimiento");
    			String descripcion = result.getString("descConcepto");
    			cm = new ConceptoMovimiento(id, descripcion, tipoMov, true);
    			conceptos.add(cm);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return conceptos;
    }
}
